/**
 *
 * @author Roninwz
 * @date 2019/1/14 下午15:38
 * @since 1.0.0
 *
 * findAllFileSync  获取当前目录下所有的文件
 * readFile   遍历读取文件
 * getFileList  获取文件对象数组列表
 * getAllFileSize  获取当前目录下所有文件的总和
 * getDirectoryList  获取文件夹列表
 * getFileExtName   获取文件的后缀名
 * writeFile  写入文件utf-8格式
 * deleteFolder  删除指定文件夹下得所有文件
 * deleteFile  删除指定文件
 * deleteFileOrDirectory删除指定文件或文件夹
 */

var fs = require('fs');
var path = require('path');
/*nodejs自带的模块*/
const myFileUtil = {};


/**
 *  获取当前目录下所有的文件 返回 数组
 * @param startPath  起始目录文件夹路径
 * @returns {Array}
 */
myFileUtil.findAllFileSync = function (startPath) {
  let result = [];

  function finder(myPath) {
    let files = fs.readdirSync(myPath);
    files.forEach((val, index) => {
      let fPath = path.join(myPath, val);
      let stats = fs.statSync(fPath);
      if (stats.isDirectory()) {
        finder(fPath);
      }
      if (stats.isFile()) {
        result.push(fPath);
      }
    });

  }

  finder(startPath);
  return result;
};


/**
 * 遍历读取文件
 * @param myPath
 * @param filesList
 */
myFileUtil.readFile = function (myPath, filesList) {
  let files, states;
  files = fs.readdirSync(myPath);//需要用到同步读取
  files.forEach(walk);

  function walk(file) {
    states = fs.statSync(myPath + '/' + file);
    if (states.isDirectory()) {
      myFileUtil.readFile(myPath + '/' + file, filesList);
    }
    else {
      //创建一个对象保存信息
      let obj = new Object();
      obj.size = states.size;//文件大小，以字节为单位
      obj.name = file;//文件名
      obj.path = myPath + '/' + file; //文件绝对路径
      filesList.push(obj);
    }
  }
};

/**
 * 获取文件对象数组列表  依赖 readFile
 * @param myPath
 * @returns {Array}  size  文件大小   name 文件名  path 文件路径
 */
myFileUtil.getFileList = function (myPath) {
  let filesList = [];
  myFileUtil.readFile(myPath, filesList);
  return filesList;
};

/**
 * 获取当前目录下所有文件的总和 大小  单位字节
 * @param myPath
 * @returns {number}
 */
myFileUtil.getAllFileSize = function (myPath) {

  let filesList = myFileUtil.getFileList(myPath);
  let sizeAll = 0;
  for (let i = 0; i < filesList.length; i++) {
    let sizeOne = filesList[i].size;
    sizeAll += sizeOne;
  }
  return sizeAll;
};

/**
 * 获取文件夹列表
 * @param myPath
 * @returns {Array}
 */
myFileUtil.getDirectoryList = function (myPath) {
  const items = fs.readdirSync(myPath);
  let result = [];

  // 遍历当前目录中所有的文件和文件夹
  items.map(item => {
    let temp = path.join(myPath, item);

    // 若当前的为文件夹
    if (fs.statSync(temp).isDirectory()) {
      result.push(item); // 存储当前文件夹的名字

      // 进入下一级文件夹访问
      result = result.concat(myFileUtil.getDirectoryList(temp));
    }
  });
  return result;
};

/**
 * 获取文件的后缀名
 * @param file
 * @returns {*}
 */
myFileUtil.getFileExtName = function (file) {

  let extName = path.extname(file);	 //获取文件的后缀名
  return extName;
};


/**
 * 写入文件utf-8格式
 * @param fileName  文件名
 * @param data  数据
 */
myFileUtil.writeFile = function (fileName, data) {
  fs.writeFile(fileName, data, 'utf-8', complete);

  function complete() {
    console.log("文件生成成功");
  }
};

/**
 * 删除指定文件夹下得所有文件
 * @param myPath
 */
myFileUtil.deleteFolder = function (myPath) {
  let files = [];
  if (fs.existsSync(myPath)) {
    files = fs.readdirSync(myPath);
    files.forEach(function (file, index) {
      let curPath = myPath + "/" + file;
      if (fs.statSync(curPath).isDirectory()) { // recurse
        myFileUtil.deleteFolder(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(myPath);
  }
};


/**
 * 删除指定文件
 * @param myPath
 */
myFileUtil.deleteFile = function (myPath) {
  if (fs.existsSync(myPath)) {
    let info = fs.statSync(myPath);
    if (info.isFile()) {//目录
      fs.unlinkSync(myPath);//删除文件
    }
  }
};

/**
 * 删除指定文件或文件夹
 * @param myPath
 */
myFileUtil.deleteFileOrDirectory = function (myPath) {
  if (fs.existsSync(myPath)) {
    let info = fs.statSync(myPath);
    if (info.isFile()) {//目录
      fs.unlinkSync(myPath);//删除文件
    } else if (info.isDirectory()) {
      myFileUtil.deleteFolder(myPath)
    }
  }
};

module.exports = myFileUtil;

